package com.emerquim.bean.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;

import com.emerquim.persistence.dao.PMedicos;
import com.emerquim.persistence.dao.PMedicosDAO;
import com.emerquim.security.AppUser;

/**
 * Clase para persistir las consultas
 * @author Felipe Criales
 */
public class Consulta {
	
	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(Consulta.class);
	
	// ---------------------------------------------------
	// Atributos de la clase
	// ---------------------------------------------------
	/**
	 * Descripcion de la consulta
	 */
	private String descripcionConsulta;
	
	/**
	 * Informacion CISPROQUIM
	 */
	private String informacionRespuesta;
	
	/**
	 * Fuente de la informacion 
	 */
	private String fuenteInformacion;
	
	/**
	 * Medio de envio de la informacion
	 */
	private long medioEnvio;
	
	/**
	 * Fecha de cierre de la consulta
	 */
	private Date fechaConsulta;
	
	/**
	 * Nombre asesor tecnico
	 */
	private String nombreAsesorTecnico;
	
	/**
	 * Nombre del medico
	 */
	private String nombreMedico;
	
	/**
	 * La identificacion del medico
	 */
	private int idMedico;

	/**
	 * Constructor de la clase con parametros
	 * @param descripcionConsulta
	 * @param informacionRespuesta
	 * @param fuenteInformacion
	 * @param medioEnvio
	 * @param fechaConsulta
	 * @param nombreAsesorTecnico
	 * @param nombreMedico
	 * @param idMedico
	 */
	public Consulta(String descripcionConsulta, String informacionRespuesta,
			String fuenteInformacion, long medioEnvio, Date fechaConsulta,
			String nombreAsesorTecnico, String nombreMedico, int idMedico) {
		this.descripcionConsulta = descripcionConsulta;
		this.informacionRespuesta = informacionRespuesta;
		this.fuenteInformacion = fuenteInformacion;
		this.medioEnvio = medioEnvio;
		this.fechaConsulta = fechaConsulta;
		this.nombreAsesorTecnico = nombreAsesorTecnico;
		this.nombreMedico = nombreMedico;
		this.idMedico = idMedico;
	}

	/**
	 * Constructor de la clase sin parametros
	 */
	public Consulta() {
		this.inicializarDatos();
	}
	
	/**
	 * Inicializa los datos en blanco de la consulta
	 */
	public void inicializarDatos() {
		this.descripcionConsulta = "";
		this.informacionRespuesta = "";
		this.fuenteInformacion = "";
		this.medioEnvio = 1;
		this.fechaConsulta = new Date();				
		this.nombreMedico = "";
		this.idMedico = -1;
		
		// Traer el nombre del asesor
		this.nombreAsesorTecnico = "";
		FacesContext context = FacesContext.getCurrentInstance();
		AppUser appUser = (AppUser) context.getApplication().evaluateExpressionGet(context, "#{appUser}", AppUser.class);
    	if(appUser != null)
    		this.nombreAsesorTecnico = appUser.getNombreVisibleUsuario();
	}

	/**
	 * @return the descripcionConsulta
	 */
	public String getDescripcionConsulta() {
		return descripcionConsulta;
	}

	/**
	 * @param descripcionConsulta the descripcionConsulta to set
	 */
	public void setDescripcionConsulta(String descripcionConsulta) {
		this.descripcionConsulta = descripcionConsulta;
	}

	/**
	 * @return the informacionRespuesta
	 */
	public String getInformacionRespuesta() {
		return informacionRespuesta;
	}

	/**
	 * @param informacionRespuesta the informacionRespuesta to set
	 */
	public void setInformacionRespuesta(String informacionRespuesta) {
		this.informacionRespuesta = informacionRespuesta;
	}

	/**
	 * @return the fuenteInformacion
	 */
	public String getFuenteInformacion() {
		return fuenteInformacion;
	}

	/**
	 * @param fuenteInformacion the fuenteInformacion to set
	 */
	public void setFuenteInformacion(String fuenteInformacion) {
		this.fuenteInformacion = fuenteInformacion;
	}

	/**
	 * @return the medioEnvio
	 */
	public long getMedioEnvio() {
		return medioEnvio;
	}

	/**
	 * @param medioEnvio the medioEnvio to set
	 */
	public void setMedioEnvio(long medioEnvio) {
		this.medioEnvio = medioEnvio;
	}

	/**
	 * @return the fechaConsulta
	 */
	public Date getFechaConsulta() {
		return fechaConsulta;
	}

	/**
	 * @param fechaConsulta the fechaConsulta to set
	 */
	public void setFechaConsulta(Date fechaConsulta) {
		this.fechaConsulta = fechaConsulta;
	}

	/**
	 * @return the nombreAsesorTecnico
	 */
	public String getNombreAsesorTecnico() {
		return nombreAsesorTecnico;
	}

	/**
	 * @param nombreAsesorTecnico the nombreAsesorTecnico to set
	 */
	public void setNombreAsesorTecnico(String nombreAsesorTecnico) {
		this.nombreAsesorTecnico = nombreAsesorTecnico;
	}

	/**
	 * @return the nombreMedico
	 */
	public String getNombreMedico() {
		return nombreMedico;
	}

	/**
	 * @param nombreMedico the nombreMedico to set
	 */
	public void setNombreMedico(String nombreMedico) {
		this.nombreMedico = nombreMedico;
	}	
	
	/**
	 * @return the idMedico
	 */
	public int getIdMedico() {
		return idMedico;
	}

	/**
	 * @param idMedico the idMedico to set
	 */
	public void setIdMedico(int idMedico) {
		this.idMedico = idMedico;
	}

	/**
	 * Retorna la lista de medicos disponibles para agregar
	 */
	public List getListaMedicos() {

		// 1. Traer la lista de medicos de la base de datos
		ArrayList<SelectItem> listaItems = new ArrayList<SelectItem>();
		PMedicosDAO medicosDao = new PMedicosDAO();
		try{
			List<PMedicos> miListaMedicos = medicosDao.findAll();
			Iterator<PMedicos> it = miListaMedicos.iterator();
			while(it.hasNext()){
				PMedicos medico = (PMedicos) it.next();			
				String key = medico.getId().getPTipoDocumento().getTdoId() + "," + medico.getId().getMedId();
				String label = medico.getMedApe1() + " " + medico.getMedApe2() + ", " + medico.getMedNom1();
				listaItems.add(new SelectItem(key, label));
			}			
		}catch  (HibernateException e) {			
			log.error("Error al consultar la lista de medicos de la base de datos", e);
		}finally{
			medicosDao.getSession().close();	 
		}
	    return listaItems;
    }
}
